from django.db import connections
from django.db.utils import OperationalError
from apps.datavalidation.services.dbconfig import DBconfigService  # 导入数据库配置服务
from utils.db_utils import DynamicDBManager # 导入动态数据库管理工具


class ValidationService:
    """校验SQL Server类型数据库的相关表内容"""

    @staticmethod
    def val_real_time(organ_id):
        """
        实时校验指定医院（仪征二院）的数据库表内容
        1. 获取数据库配置中的db_alias
        2. 使用该连接查询对应数据库的数据
        """
        # 1. 获取指定机构的数据库配置
        db_configs = DBconfigService.get_database_configs_by_organ(organ_id)

        if not db_configs:
            return {"success": False, "error": f"未找到机构ID {organ_id} 的数据库配置"}

        # 存储所有数据库的校验结果
        validation_results = []

        # 2. 遍历每个数据库配置进行校验
        for config in db_configs:
            # 从配置中获取db_alias（数据库别名）
            db_alias = config.get('db_alias')
            if not db_alias:
                validation_results.append({
                    "db_alias": None,
                    "success": False,
                    "error": "数据库配置中缺少db_alias"
                })
                continue

            try:
                # 3. 确保数据库连接已加载（动态数据库配置需要手动加载）
                if db_alias not in connections:
                    DynamicDBManager.load_third_party_dbs()  # 加载第三方数据库配置

                # 4. 使用db_alias获取数据库连接并执行查询
                with connections[db_alias].cursor() as cursor:
                    # 示例：查询某个表的记录数（根据实际需求修改SQL）
                    # 注意：这里假设是SQL Server数据库，使用对应的SQL语法
                    cursor.execute("SELECT * FROM dbo.EMR_PATIENT_BASIC_INFORMATION")  # 替换为实际表名
                    count = cursor.fetchone()[0]  # 获取查询结果

                    # 可以添加更多校验逻辑（如字段校验、数据格式校验等）

                    validation_results.append({
                        "db_alias": db_alias,
                        "success": True,
                        "message": f"校验成功，患者表记录数：{count}",
                        "table_count": count
                    })

            except OperationalError as e:
                # 数据库连接错误
                validation_results.append({
                    "db_alias": db_alias,
                    "success": False,
                    "error": f"数据库连接失败：{str(e)}"
                })
            except Exception as e:
                # 其他查询错误（如SQL语法错误、表不存在等）
                validation_results.append({
                    "db_alias": db_alias,
                    "success": False,
                    "error": f"查询失败：{str(e)}"
                })

        # 返回所有数据库的校验汇总结果
        return {
            "organ_id": organ_id,
            "total_databases": len(db_configs),
            "success_count": sum(1 for res in validation_results if res["success"]),
            "details": validation_results
        }
